package com.wwdeng.print.app.printer;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.List;

/**
 * PrintTestDemo
 *
 * @Author：wwdeng
 * @CreateTime：2025/4/27 23:20
 * <pre>
 *     一行显示三列
 * </pre>
 */
public class EscPosThreeColumnPrinter {

    // 默认编码（推荐GBK或打印机支持的编码）
    private static final String DEFAULT_ENCODING = "GBK";
    // 列宽度配置
    private static final int LEFT_WIDTH = 16;
    private static final int MIDDLE_WIDTH = 16;
    private static final int RIGHT_WIDTH = 16;

    /**
     * 生成三列打印数据（空格占位）
     * @param leftText 左列内容
     * @param centerText 中列内容
     * @param rightText 右列内容
     * @return ESC/POS指令字节数组
     * @throws IOException 如果发生I/O错误
     */
    public static byte[] generateThreeColumns(String leftText,
                                              String centerText,
                                              String rightText) throws IOException {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        // 1. 打印数据行
        printDataRow(outputStream,
                formatColumn(leftText, LEFT_WIDTH),
                formatColumn(centerText, MIDDLE_WIDTH),
                formatColumn(rightText, RIGHT_WIDTH)
        );
        return outputStream.toByteArray();
    }

    /**
     * 格式化列内容（填充空格）
     * @param text 原始文本
     * @param width 列宽度
     * @return 格式化后的文本
     */
    private static String formatColumn(String text, int width) {
        if (text == null) text = "";
        if (text.length() > width) {
            return text.substring(0, width);
        }
        return String.format("%-" + width + "s", text);
    }

    /**
     * 打印数据行（使用空格占位）
     */
    private static void printDataRow(ByteArrayOutputStream stream,
                                     String leftText,
                                     String middleText,
                                     String rightText) throws IOException {
        // 组合三列内容（用空格占位）
        String fullLine = leftText + middleText + rightText;
        writeText(stream, fullLine);
    }

    /**
     * 写入文本内容
     */
    private static void writeText(ByteArrayOutputStream stream, String text) throws IOException {
        stream.write(text.getBytes(Charset.forName(DEFAULT_ENCODING)));
    }
}
